package guard.finder.utils;

import guard.finder.objetos.eventos;
import guard.finder.objetos.implicados;
import guard.finder.objetos.reporte;
import guard.finder.objetos.ubicacion;

import java.util.ArrayList;
import java.util.Iterator;

import org.json.*;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

public class conexionWS {
	String NAMESPACE="http://guardFinderWS/";
	String URL="http://10.0.2.2:8080/guardFinderWS/guardFinderWS?WSDL";
	
	public conexionWS() { }
	
	/**
	 * Funcion para comunicarse con el WS y que este se encargue de registrar el check-in en la base
	 * de datos.
	 * @param usuario El usuario que inicio sesion en la aplicacion.
	 * @param latitud Latitud aproximada donde esta ubicado el guarda.
	 * @param longitud Longitud aproximada donde esta ubicado el guarda.
	 * @param fecha La fecha en que se realiza el check-in, con el siguiente formato: yyyy-mm-dd.
	 * @param hora La hora en que se realiza el check-in, con el siguiente formato: hh:mm:ss.
	 * @return El resultado del WS.
	 */
	public String checkIn(String usuario, int id){
		String METHOD_NAME="registrarUbicacion";
		String SOAP_ACTION= "registrarUbicacion";		
		SoapObject request;
		request = new SoapObject(NAMESPACE, METHOD_NAME);
		request.addProperty("usuario", usuario);
		request.addProperty("idUbicacion", id);
		String jString = comunicarse(METHOD_NAME,SOAP_ACTION,request);
		JSONObject jObject;
		try {
			jObject = new JSONObject(jString);
			String x = jObject.getString("valores");
			return x;
		} catch (JSONException e) {
			return "No se ha podido comunicar con el Web Service";
			}
	}
	
	/**
	 * Funcion para validar el acceso a la aplicacion.
	 * @param usuario El nombre del usuario.
	 * @param clave La contrasenna del usuario.
	 * @return El resultado del WS.
	 */
	public String logInNormal(String usuario, String clave){
		String METHOD_NAME="iniciarSesion";
		String SOAP_ACTION= "iniciarSesion";		
		SoapObject request;
		request = new SoapObject(NAMESPACE, METHOD_NAME);
		request.addProperty("usuario", usuario);
		request.addProperty("clave", clave);
		String jString = comunicarse(METHOD_NAME, SOAP_ACTION, request);
		JSONObject jObject;
		try {
			jObject = new JSONObject(jString);
			String x =jObject.getString("valores");
			return x;
			
		} catch (JSONException e) {
			return "No se ha podido comunicar con el Web Service";
		}
	}
	
	/**
	 * Obtener una lista de los eventos.
	 * @return Lista de eventos de la base de datos.
	 */
	public ArrayList<eventos> obtenerEventos(){
		String METHOD_NAME="obtenerEventos";
		String SOAP_ACTION= "obtenerEventos";		
		SoapObject request;
		request = new SoapObject(NAMESPACE, METHOD_NAME);
		String jString = comunicarse(METHOD_NAME, SOAP_ACTION, request);
		JSONObject jObject;
		ArrayList<eventos> eventosArray = new ArrayList<eventos>();
		try{
			jObject = new JSONObject(jString);
			JSONArray valoresItemsArray = jObject.getJSONArray("valores");
			for (int i = 0; i < valoresItemsArray.length(); i++) {
				int id = Integer.valueOf(valoresItemsArray.getJSONObject(i).getString("id"));
				String evento = valoresItemsArray.getJSONObject(i).getString("valor");
				eventosArray.add(new eventos(id, evento));
				}
			}
		catch(Exception e){
			
		}
		return eventosArray	;
	}
	
	public ArrayList<ubicacion> obtenerUbicacion(double latitud, double longitud){
		String METHOD_NAME="obtenerUbicacion";
		String SOAP_ACTION= "obtenerUbicacion";		
		SoapObject request;
		request = new SoapObject(NAMESPACE, METHOD_NAME);
		request.addProperty("latitud", String.valueOf(latitud));
		request.addProperty("longitud", String.valueOf(longitud));
		String jString = comunicarse(METHOD_NAME, SOAP_ACTION, request);
		JSONObject jObject;
		ArrayList<ubicacion> ubicacionesArray = new ArrayList<ubicacion>();
		try{
			jObject = new JSONObject(jString);
			JSONArray valoresItemsArray = jObject.getJSONArray("valores");
			for (int i = 0; i < valoresItemsArray.length(); i++) {
				int id = Integer.valueOf(valoresItemsArray.getJSONObject(i).getString("id"));
				String ubicacion = valoresItemsArray.getJSONObject(i).getString("valor");
				ubicacionesArray.add(new ubicacion(id, ubicacion));
				}
			}
		catch(Exception e){
			
		}
		return ubicacionesArray	;
	}
	
	public String crearReporte(reporte report) {
		String METHOD_NAME="reporteVigilancia";
		String SOAP_ACTION= "reporteVigilancia";
		SoapObject request;
		request = new SoapObject(NAMESPACE, METHOD_NAME);
		JSONArray jsonImplicados = new JSONArray();
		JSONObject jsonObjeto = new JSONObject();
		try {
			for (Iterator<implicados> i = report.getImplicadosLista().iterator(); i.hasNext(); ){
				JSONObject obj = new JSONObject();
				implicados imp= i.next();
				obj.put("nombre", imp.getNombre());
				obj.put("email", imp.getEmail());
				jsonImplicados.put(obj);
				}
			jsonObjeto.put("implicados", jsonImplicados);
			} catch (JSONException e) {
				e.printStackTrace();
		}
		request.addProperty("involucrados", jsonObjeto.toString());
		request.addProperty("lugar", report.getLugar());
		request.addProperty("sector", report.getSector());
		request.addProperty("evento", report.getEvento().getId());
		request.addProperty("observaciones", report.getDescripcion());
		request.addProperty("guarda", report.getGuarda());		
		String jString = comunicarse(METHOD_NAME, SOAP_ACTION, request);
		JSONObject jObject;
		try {
			jObject = new JSONObject(jString);
			String x =jObject.getString("valores");
			return x;
			
		} catch (JSONException e) {
			return "No se ha podido comunicar con el Web Service";
		}
	}
	
	private String comunicarse(String METHOD_NAME,String SOAP_ACTION,SoapObject request){
		Object result;
		try {
		SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
		envelope.dotNet=false;
		envelope.setOutputSoapObject(request);
		HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
		androidHttpTransport.call(SOAP_ACTION, envelope);
		result = (Object)envelope.getResponse();
		return result.toString();
		}
		catch (Exception e)
		{
		return e.toString();
		}
	}
}
